package com.qf.userfull.dict;

import java.util.stream.Stream;

/**
 * 字典实现类
 * （使用Hash表的方式进行实现，链表解决hash下标冲突）
 */
public class DictionaryImpl implements Dictionary {

    // 单词的数组
    Word[] arr = new Word[100000];

    // 区分英单词的首字母
//    private Word[] wordStatWithA = new Word[1000];

    // 记录单词的数量
    private int count = 0;

    /**
     * 找到单词在数组中应该存放的位置
     *
     * @param englishWord
     * @param chineseWord
     */
    @Override
    public void addWord(String englishWord, String chineseWord) {
        Word word = new Word(englishWord, chineseWord);
        int index = getArrIndex(englishWord); // 计算英文单词应该存放的数组的下标

        // 如果一开始就是空,直接填值
        if (arr[index] == null) {
            arr[index] = word;
            return;
        }

        // 不为空,已经没有位置了,存放在同一个位置的链表
        Word indexWord = arr[index]; // 链表的指针
        while (true) {
            if (indexWord.getNextWord() == null) { // 如果为null,就填word
                indexWord.setNextWord(word);
                break;
            }
            // 不是null,继续往下查找,直到找到null为止
            indexWord = indexWord.getNextWord();
        }


        count++; // 单词数量加一
    }


    /**
     * 类中的不想让外面代码方法的方法，可以使用private修饰
     * <p>
     * 如何把 一个 englishWord 转换为 [0,arr.length-1] 内的一个整数呢？
     *
     * @param englishWord
     * @return
     */
    private int getArrIndex(String englishWord) {

        int hashCode = englishWord.hashCode();
        int index = hashCode % arr.length;

        if (index < 0) {
            index *= -1;
        }

        return index;
    }

    /**
     * 通过给定的 英文单词 查找对应的 中文单词
     *
     * @param englishWord 给出英文单词
     * @return 如果存在返回对应的 中文单词,否则返回 null
     */
    @Override
    public String findWord(String englishWord) {
//        for (int i = 0; i < count; i++) {
//            Word word = arr[i];
//            if (word.getEnglishWord().equals(englishWord)){
//                return word.getChineseWord();
//            }
//        }
        int index = getArrIndex(englishWord); // 获取下标

        return indexNext(arr[index], englishWord); // 根据下标进行链表查询
    }

    /**
     * 根据索引到的单词查询
     *
     * @param word
     * @param enWord
     * @return 如果word不存在 返回null, 如果word存在 返回 cnWord
     */
    public String indexNext(Word word, String enWord) {
        // 如果索引对应的 Word不存在,直接返回 null
        if (word == null) return null;

        if (enWord.equals(word.getEnglishWord())) { // 终止条件
            return word.getChineseWord();
        }

        return indexNext(word.getNextWord(), enWord); // 回调直到找到终止条件
    }

    /**
     * 打印字典中的每一组单词
     */
    public void printInfo() {
        for (int i = 0; i < arr.length; i++) {

            if (arr[i] == null) continue;

            System.out.print("第" + (i + 1) + "个单词: ");
            System.out.println(arr[i].toString());
        }
    }
}



